package hu.arguscab.ai;

/**
 *
 * @param <E> Edge által tárolt objektum
 * @param <N> Node által tárolt objektum
 * @author sharp
 */
public interface Graph<E, N> {


	/**
	 * Hozzáad egy Node párost a gráfhoz.
	 * @param pair
	 */
	void addNodePair( NodePair<E, N> pair );

	/**
	 * 
	 * Kifejti ezt a gráfot. Azaz valamilyen belső logika alapján beállítja a gyökerét, és feltölti Node-okkal.
	 */
	void evaulate();

	/**
	 * Új node hozzáadása a gráfhoz
	 * @param from		szülő
	 * @param newNode	gyermek
	 * @param edge		őket összekötő él
	 */
	void addNode(Node<N> from, Node<N> newNode, Edge<E> edge);

	/**
	 * Beállítja a gyökérnode-ot a gráfnak.
	 * ( Gráfnak nincs gyökere, de a keresések ebből indulnak )
	 * @param rootObject Az objektum, ami a gyökeret képviseli. Egy Node-ba lesz beágyazva
	 * @return The newly created root Node.
	 */
	Node<N> setRoot(N rootObject);
	void setRoot(Node<N> root);

	/**
	 * Kitörli a node-ot
	 * @param node
	 */
	void deleteNode(Node<N> node);

	/**
	 * @return gyökérnode
	 */
	Node<N> getRoot();

	/**
	 * A két node-ot összekötő éllel tér vissza, ha létezik. Ellenben nullal.
	 * @param from szülő
	 * @param to gyermek
	 * @return a szülőt és gyermeket összekötő éllel.
	 */
	Edge<E> getEdge(Node<N> from, Node<N> to);

	/**
	 * @param node
	 * @return a node fokával.
	 */
	int degree(Node<N> node);

	/**
	 * @param node
	 * @return a node-dal szomszédos node-ok halmaza
	 */
	Iterable<Node<N>> adjacentTo(Node<N> node);

	/**
	 * @param node
	 * @return igaz, ha a node része a gráfnak
	 */
	boolean containsNode(Node<N> node);
	/**
	 * @param from
	 * @param to
	 * @return igaz, ha a 2 node között van él
	 */
	boolean containsEdge(Node<N> from, Node<N> to);


	/**
	 *
	 * @return
	 */
	Iterable<Node<N>> depthSearchIterator();

	/**
	 *
	 * @return
	 */
	Iterable<Node<N>> breathSearchIterator(Node<N> root);

	void clear();
}